home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / WINPROGS / UPC12BS1.ZIP / UUCICO / CHECKTIM.C next >
C/C++ Source or Header  |  1993-09-20  |  14KB  |  337 lines

  1. /*--------------------------------------------------------------------*/
  2. /*    c h e c k t i m . c                                             */
  3. /*                                                                    */
  4. /*    Time of day validation routine for UUPC/extended                */
  5. /*--------------------------------------------------------------------*/
  6.  
  7. /*--------------------------------------------------------------------*/
  8. /*       Changes Copyright (c) 1989-1993 by Kendra Electronic         */
  9. /*       Wonderworks.                                                 */
  10. /*                                                                    */
  11. /*       All rights reserved except those explicitly granted by       */
  12. /*       the UUPC/extended license agreement.                         */
  13. /*--------------------------------------------------------------------*/
  14.  
  15. /*--------------------------------------------------------------------*/
  16. /*                          RCS Information                           */
  17. /*--------------------------------------------------------------------*/
  18.  
  19. /*
  20.  *    $Id: checktim.c 1.2 1993/09/20 04:46:34 ahd Exp $
  21.  *
  22.  *    Revision history:
  23.  *    $Log: checktim.c $
  24.  * Revision 1.2  1993/09/20  04:46:34  ahd
  25.  * OS/2 2.x support (BC++ 1.0 support)
  26.  * TCP/IP support from Dave Watt
  27.  * 't' protocol support
  28.  *
  29.  */
  30.  
  31. /*--------------------------------------------------------------------*/
  32. /*                        System include files                        */
  33. /*--------------------------------------------------------------------*/
  34.  
  35. #include <stdio.h>
  36. #include <string.h>
  37. #include <stdlib.h>
  38. #include <time.h>
  39.  
  40. /*--------------------------------------------------------------------*/
  41. /*                    UUPC/extended include files                     */
  42. /*--------------------------------------------------------------------*/
  43.  
  44. #include "lib.h"
  45. #include "checktim.h"
  46.  
  47. /*--------------------------------------------------------------------*/
  48. /*                          Global variables                          */
  49. /*--------------------------------------------------------------------*/
  50.  
  51. currentfile();
  52.  
  53. /*--------------------------------------------------------------------*/
  54. /*                          Local functions                           */
  55. /*--------------------------------------------------------------------*/
  56.  
  57. static char checkone( char *input, size_t hhmm, int weekday );
  58.  
  59. /*--------------------------------------------------------------------*/
  60. /*   The following day values are based on the fact the               */
  61. /*   localtime() call returns the day of the week as a value zero     */
  62. /*   (0) through six (6), which is converted into the bit number      */
  63. /*   and then AND'ed against the date mask.                           */
  64. /*--------------------------------------------------------------------*/
  65.  
  66. #define SUN 0x80
  67. #define MON 0x40
  68. #define TUE 0x20
  69. #define WED 0x10
  70. #define THU 0x08
  71. #define FRI 0x04
  72. #define SAT 0x02
  73. #define NEVER 0x00
  74. #define WEEKEND (SAT | SUN)
  75. #define WEEKDAY (MON | TUE | WED | THU | FRI)
  76. #define ANY (WEEKEND | WEEKDAY)
  77.  
  78. /*--------------------------------------------------------------------*/
  79. /*   Table of values for schedules.  Based on values given for        */
  80. /*   legal schedule keywords in "Managing uucp and Usenet" by         */
  81. /*   O'Reilly & Associates.  Multiple entries for a single keyword    */
  82. /*   are processed in logical OR fashion, just as multiple entries    */
  83. /*   for the same host in L.sys are treated in a logical OR           */
  84. /*   fashion.                                                         */
  85. /*                                                                    */
  86. /*   Timing windows are adjusted five minutes away from higher        */
  87. /*   telephone rates in an attempt to avoid massive charges           */
  88. /*   because of inaccurate PC clocks and the fact that a telephone    */
  89. /*   call generally requires more than one minute if the system is    */
  90. /*   trying to do useful work.                                        */
  91. /*                                                                    */
  92. /*   Does not support multiple keywords in one token                  */
  93. /*   (TuFr0800-0805), but allows multiple tokens                      */
  94. /*   (Tu0800-805,Fr0800-0805) on one line.                            */
  95. /*                                                                    */
  96. /*   The NonPeak keyword has been corrected to the current (May       */
  97. /*   1989) NonPeak hours for Telenet's PC-Pursuit.  However, keep     */
  98. /*   in mind the PC-Pursuit customer agreement specifies that you     */
  99. /*   can't use PC-Pursuit to network multiple PC's, so thou shalt     */
  100. /*   not use PC-Pursuit from a central mail server.  *sigh*           */
  101. /*                                                                    */
  102. /*   I also have Reach-Out America from ATT, for which night rates    */
  103. /*   begin at 10:00 pm.  It is duly added to the table.               */
  104. /*--------------------------------------------------------------------*/
  105.  
  106. static struct Table {
  107.    char *keyword;
  108.    int wdays;
  109.    unsigned int start;
  110.    unsigned int end;
  111.  
  112. } table[] = {
  113.    { "Any",     ANY,         0, 2400},
  114.    { "Wk",      WEEKDAY,     0, 2400},
  115.    { "Su",      SUN,         0, 2400},
  116.    { "Mo",      MON,         0, 2400},
  117.    { "Tu",      TUE,         0, 2400},
  118.    { "We",      WED,         0, 2400},
  119.    { "Th",      THU,         0, 2400},
  120.    { "Fr",      FRI,         0, 2400},
  121.    { "Sa",      SAT,         0, 2400},
  122.    { "Evening", WEEKDAY,  1705,  755},
  123.    { "Evening", WEEKEND,     0, 2400},
  124.    { "Night",   WEEKDAY,  2305,  755},
  125.    { "Night",   SAT,         0, 2400},
  126.    { "Night",   SUN,      2305, 1655},
  127.    { "NonPeak", WEEKDAY,  1805,  655}, /* Subject to change at TELENET's whim */
  128.    { "NonPeak", WEEKEND,     0, 2400},
  129.    { "ROA",     WEEKDAY,  2205,  755}, /* Reach Out America (sm) (AT&T)       */
  130.    { "ROA",     SAT,         0, 2400}, /* Reach Out America (sm) (AT&T)       */
  131.    { "ROA",     SUN,      2205, 1655}, /* Reach Out America (sm) (AT&T)       */
  132.    { "Never",   NEVER,       0, 2400},
  133.    {  nil(char) }
  134. }; /* table */
  135.  
  136. /*--------------------------------------------------------------------*/
  137. /*    c h e c k t i m e                                               */
  138. /*                                                                    */
  139. /*    Validate a time of day field; returns lowest grade              */
  140. /*--------------------------------------------------------------------*/
  141.  
  142. char checktime(const char *xtime)
  143. {
  144.  
  145.    struct tm *tm_now;
  146.    time_t secs_now;
  147.    size_t hhmm;
  148.    char  buf[BUFSIZ];
  149.    char  *token;
  150.    char  *nexttoken;
  151.    char  bestgrade = '\0';    /* No grade found yet                  */
  152.    int   weekday;
  153.  
  154.    strcpy(buf,xtime);         /* Copy time to local buffer we can alter */
  155.    time(&secs_now);
  156.    tm_now = localtime(&secs_now);
  157.                                        /* Create structure with time    */
  158.    weekday = SUN >> tm_now->tm_wday;   /* Get day of week as single bit */
  159.    hhmm = tm_now->tm_hour*100 + tm_now->tm_min;
  160.    nexttoken = buf;           /* First pass, look at start of buffer    */
  161.  
  162.    while ((bestgrade < ALL_GRADES) &&
  163.           ((token = strtok(nexttoken,",")) != NULL))
  164.    {
  165.       char grade = checkone( token, hhmm, weekday);
  166.  
  167.       if ( bestgrade < grade )
  168.             bestgrade = grade;
  169.  
  170.       nexttoken = NULL;       /* Continue parsing same string           */
  171.  
  172.    } /* while (!(dial) && ((token = strtok(nexttoken,",")) != NULL) ) */
  173.  
  174. /*--------------------------------------------------------------------*/
  175. /*            Report our results and return to the caller             */
  176. /*--------------------------------------------------------------------*/
  177.  
  178.    return (bestgrade);
  179.  
  180. } /*checktime*/
  181.  
  182. /*--------------------------------------------------------------------*/
  183. /*    c h e c k o n e                                                 */
  184. /*